一 jstat查看虚拟机统计信息
命令格式:
1 | $ jstat -help |
命令详细说明参考官方文档:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE
- 类加载信息查看
jstat -class …
1 | $ jps |
命令解释 jstat -class 54215 1000 10
54215 是PID
1000 是间隔时间1000毫秒
10 是输出十次
输出信息说明:
Class loader statistics.
Loaded: Number of classes loaded.
Bytes: Number of kBs loaded.
Unloaded: Number of classes unloaded.
Bytes: Number of Kbytes unloaded.
Time: Time spent performing class loading and unloading operations.
- 垃圾收集信息
options 有 -gc、-gcutil、-gccause、-gcnew、-gcold
1 | $ jstat -gc 58589 1000 3 |
-gc option
Garbage-collected heap statistics.
S0C: Current survivor space 0 capacity (kB).
S1C: Current survivor space 1 capacity (kB).
S0U: Survivor space 0 utilization (kB).
S1U: Survivor space 1 utilization (kB).
EC: Current eden space capacity (kB).
EU: Eden space utilization (kB).
OC: Current old space capacity (kB).
OU: Old space utilization (kB).
MC: Metaspace capacity (kB).
MU: Metacspace utilization (kB).
CCSC: Compressed class space capacity (kB).
CCSU: Compressed class space used (kB).
YGC: Number of young generation garbage collection events.
YGCT: Young generation garbage collection time.
FGC: Number of full GC events.
FGCT: Full garbage collection time.
GCT: Total garbage collection time.
JVM内存结构图
堆区
yong (S0、S1、Eden)
old
非堆区Metaspace
CCS - 启用了短指针时的压缩类空间
CodeCache - JIT的代码信息把Java代码转化为Native代码 jni代码等
- JIT编译信息
options 有 -compiler -printcompilation
-compiler option
Java HotSpot VM Just-in-Time compiler statistics.
Compiled: Number of compilation tasks performed.
Failed: Number of compilations tasks failed.
Invalid: Number of compilation tasks that were invalidated.
Time: Time spent performing compilation tasks.
FailedType: Compile type of the last failed compilation.
FailedMethod: Class name and method of the last failed compilation.
二 jmap+MAT实战内存溢出
实战堆内存溢出
先设置JVM参数 -Xmx32M -Xmx32M
再调用SpringBoot的一个Contoller方法如下:
1 | import com.jacky.imserver.entity.User; |
最终会报异常 java.lang.OutOfMemoryError: Java heap space
实战非堆内存溢出
1 编写内存溢出代码
先设置JVM参数 -XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
使用asm生成class
asm库的依赖
1 | <!-- https://mvnrepository.com/artifact/asm/asm --> |
执行的代码
1 |
|
生成类的工具类
1 | import org.objectweb.asm.ClassWriter; |
会抛出异常 java.lang.OutOfMemoryError: Metaspace
2 导出内存映像文件
内存溢出自动导出
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
使用jmap命令手动导出
1 | $ jmap -heap |
dump出来的例子:
1 | $ jmap -dump:format=b,file=heap.hprof 60899 |
3 MAT(Memory Analyzer)分析内存
使用MAT分析工具 File -> open File 打开上面dump出来的hprof内存映像文件
打开后看到如下信息,从信息中会给出内存泄漏原因:
(另外还可以从其他维度去定位是哪个类导致的内存泄漏)
1 | Leak Suspects |